package br.edu.ifrn.mb;

import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;

import org.apache.myfaces.custom.fileupload.UploadedFile;

import br.edu.ifrn.dao.AlunoDAO;
import br.edu.ifrn.dao.CursoDAO;
import br.edu.ifrn.dominio.Aluno;
import br.edu.ifrn.dominio.Curso;
import br.edu.ifrn.exception.NegocioException;
import br.edu.ifrn.generic.GenericDAO;
import br.edu.ifrn.mb.generic.GenericCrudMB;
import br.edu.ifrn.util.FacesUtil;

public class ManageAluno extends GenericCrudMB<Aluno> {
	private String matriculaAluno;
	private UploadedFile csv;

	public ManageAluno() {
		super();
		this.exibirTodosRegistrosAoPesquisar = false;
		if (!FacesUtil.getSessionUser().getUsuario().isAdministrador()) {
			this.setWhereScope(" WHERE aluno.curso.diretoria.id = "
					+ FacesUtil.getSessionUser().getDiretoria().getId());
		}
	}

	@Override
	protected GenericDAO<Aluno> getDao() {
		return new AlunoDAO();
	}

	@Override
	public String getTitulo() {
		return "Aluno";
	}

	public String importarDados() {
		return "AlunoIncluirAlterarLot";
	}

	public List<Curso> getCursos() {
		try {
			if (FacesUtil.getSessionUser().getUsuario().isAdministrador()) {
				return new CursoDAO().consultarTodos();
			} else if (FacesUtil.getSessionUser().getUsuario().isDiretor()) {
				return new CursoDAO().consultarTodos(
						" WHERE curso.diretoria.id = "
						+ FacesUtil.getSessionUser().getDiretoria()
						.getId(), "");
			} else if (FacesUtil.getSessionUser().getUsuario().isCoordenador()) {
				return new CursoDAO().consultarTodos(
						" WHERE curso.diretoria.id = "
						+ FacesUtil.getSessionUser().getDiretoria()
						.getId()
						+ ""
						+ " AND curso.coordenador.id = "
						+ FacesUtil.getSessionUser().getUsuario()
						.getId(), "");
			}
			return null;
		} catch (NegocioException e) {
			FacesUtil.adicionarMensagemErro("Erro ao consultar cursos");
			e.printStackTrace();
			return null;
		}
	}

	public String incluirLot(){
		try
		{
			String data="";

			//get the uploaded file
			InputStream stream = csv.getInputStream();
			ByteArrayOutputStream baos = new ByteArrayOutputStream();

			//get the file size
			int size = (int) csv.getSize();

			//define the byte size
			byte buffer[] = new byte[size];
			int bytesRead = 0;

			//read the input
			while( (bytesRead = stream.read(buffer, 0, size)) != -1 )
			{
				baos.write( buffer, 0, bytesRead );
			}

			//assign it to string
			data = new String(baos.toByteArray() );


			int k = 0;
			StringTokenizer st2 = new StringTokenizer(data, "\n\r");
			int dynamicArraySize = st2.countTokens() * 4;

			String[] values = new String[dynamicArraySize];
			while (st2.hasMoreTokens())
			{
				values[k] = st2.nextToken(",\n\r").toString();
				k++;
			};
			
			
			
			criarRegistros(values);
			

			stream.close();
			baos.close();
		}
		catch (Exception e)
		{
			e.printStackTrace();
			FacesUtil.adicionarMensagemErro("Erro ao importar CSV");
		}

		return exibirPesquisa();		
	}

	private void criarRegistros(String[] values) {
		int sucesso = 0;
		String lineErros = "";
		Map<String, Curso> cursos = new HashMap<String, Curso>();
		AlunoDAO alunoDao = new AlunoDAO();
		
		int count = 0;
		for (String string : values) {
			count++;
			if(string != null){
				String[] campos = string.split(";"); 
				cursos = buildCursos(campos[3].trim(), cursos);
				
				Aluno a = new Aluno(campos[0].trim(), campos[1].trim(), campos[2].trim(), cursos.get(campos[3].trim()));				
				try {
					a.validar();
					alunoDao.inserir(a);
					sucesso++;
				} catch (NegocioException e) {
					e.printStackTrace();
					lineErros+=count+", ";
				}				
			}
		}		

		FacesUtil.adicionarMensagemAviso(sucesso+" registros foram importandos");
		if(!lineErros.isEmpty()){
			FacesUtil.adicionarMensagemErro("Erro ao importar as seguintes linhas: "+lineErros.substring(0, lineErros.length()-2));
		}
	}

	private Map<String, Curso> buildCursos(String cod, Map<String, Curso> cursos) {
		
		String cond =  " WHERE curso.codigo = '"+cod+"'";
		if(!FacesUtil.getSessionUser().getUsuario().isAdministrador()){
			cond += " AND curso.diretoria.id = "+FacesUtil.getSessionUser().getDiretoria().getId();
		}
		Curso c = null;
		if(!cursos.containsKey(cod)){
			try {
				c = new CursoDAO().consultar(cond);
			} catch (NegocioException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			if(c != null){
				cursos.put(cod, c);
			}
		}
		
		return cursos;
	}

	public void setMatriculaAluno(String matriculaAluno) {
		this.matriculaAluno = matriculaAluno;
	}

	public String getMatriculaAluno() {
		return matriculaAluno;
	}

	public void filtrar() throws NegocioException {
		if (FacesUtil.getSessionUser().getUsuario().isAdministrador()) {
			this.dadosPesquisa = this.getDao().consultarTodos(
					" WHERE UPPER(aluno.matricula) LIKE '%"
					+ this.matriculaAluno.toUpperCase() + "%'", "");
		} else if (FacesUtil.getSessionUser().getUsuario().isDiretor()) {
			this.dadosPesquisa = this.getDao()
			.consultarTodos(
					" WHERE UPPER(aluno.matricula) LIKE '%"
					+ this.matriculaAluno.toUpperCase()
					+ "%' AND aluno.curso.diretoria.id = "
					+ FacesUtil.getSessionUser().getDiretoria()
					.getId(), "");
		} else if (FacesUtil.getSessionUser().getUsuario().isCoordenador()) {
			this.dadosPesquisa = this.getDao().consultarTodos(
					" WHERE UPPER(aluno.matricula) LIKE '%"
					+ this.matriculaAluno.toUpperCase()
					+ "%' AND aluno.curso.diretoria.id = "
					+ FacesUtil.getSessionUser().getDiretoria().getId()
					+ "" + " AND aluno.curso.coordenador.id = "
					+ FacesUtil.getSessionUser().getUsuario().getId(),
			"");
		}
	}

	public void setCsv(UploadedFile csv) {
		this.csv = csv;
	}

	public UploadedFile getCsv() {
		return csv;
	}
}
